import axios, { InternalAxiosRequestConfig, AxiosResponse } from 'axios'
// 自定义错误，用于捕获请求异常信息
class RequestError extends Error {
  constructor(public code: number, message: string) {
    super(message)
  }
}
// 创建axios实例
const request = axios.create({
  timeout: 3000,
  // baseURL: '/api',
})

// 请求拦截器
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig<any>) => {
    //每次请求携带请求头
    let token = localStorage.getItem('token')
    if (token) (config.headers as any).Authorization = token
    return config
  },
  (err) => {
    return Promise.reject(err)
  }
)
// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse) => {
    // 处理正常响应数据
    if (response.status === 200 && response.data.code === 0) {
      return Promise.resolve(response.data.data)
    } else {
      return Promise.reject(response.data.message)
    }
  },
  (error) => {
    // 处理异常响应数据
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 权限错误，跳转到登录页面
          break
        case 404:
          // 找不到页面，跳转到404页面
          break
        default:
        // 其他错误，弹出错误提示框
      }
    } else {
      // 断网情况下处理
      if (!window.navigator.onLine) {
        // 断网了，请检查网络连接
      } else {
        // 请求超时或者服务器异常，请稍后重试！
      }
    }
    // 抛出自定义异常，方便统一处理错误信息
    throw new RequestError(-1, error.message || '请求异常，请稍后再试')
    // return Promise.reject(error)
  }
)

// 封装get请求
function get(url: string, params: any) {
  return request({
    url,
    method: 'get',
    params,
  })
}

// 封装post请求
function post(url: string, data: any) {
  return request({
    url,
    method: 'post',
    data,
  })
}
// 封装delete请求
function deletes(url: string, params: any) {
  return request({
    url,
    method: 'delete',
    params,
  })
}
// 封装put请求
function put(url: string, data: any) {
  return request({
    url,
    method: 'put',
    data,
  })
}
export { get, post, deletes, put }
